﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __35690CAA_63CD_4a8a_8C4C_DCC696CC57B4__
#define __35690CAA_63CD_4a8a_8C4C_DCC696CC57B4__

#include "../tools/head.h"

namespace xos_json
{

    class json_impl : public xos_stl::mem_item< xos::release_impl< json_impl >, thread_lock >,
		public i_json
    {
    public:
        typedef std::vector< std::string >  STR_VECT;
        typedef STR_VECT::iterator          STR_ITER;
        typedef xos::release_impl< json_impl > T;

    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        static int get_addr( POOL *** pppPool, LIST *** pppList );

    public:
        json_impl();
        ~json_impl();

    public:
        // 
        // 读取json值
        // 
        const char * get_str( const char * lpszKey, char * lpszData, int nLen, int * pnLenNeeded );

        // 
        // 读取json的key和value值
        // 
        const char * get_key( char * lpszKey, int nLen, bool bIsFirst );

        // 
        // 读取json值
        // 
        i_json * get_json( const char * lpszKey, i_json ** ppv );

        // 
        // 读取json double值
        // 
        double get_double( const char * lpszKey, double * pdValue );

        // 
        // 读取json值
        // 
        int get_int( const char * lpszKey, int * pnValue );

        // 
        // 设置json值
        // 
        int set_str( const char * lpszKey, const char * lpszStr );

        // 
        // 设置json值,设置之后,pv与主对象是独立的
        // 
        int set_json( const char * lpszKey, i_json * pv );

        // 
        // 设置json值
        // 
        int set_double( const char * lpszKey, double dlData );

        // 
        // 设置json值
        // 
        int set_int( const char * lpszKey, int nData );

        // 
        // 读取数组值
        // 
        i_json * get_array_item( int nIndex, i_json ** ppv );

        // 
        // 向数组添加无素,添加数组字串元素
        // 
        int append_str( const char * lpszStr );

        // 
        // 向数组添加无素
        // 
        int append_double( double dlData );

        // 
        // 向数组添加无素,添加数组整数元素
        // 
        int append_int( int nData );

        // 
        // 向数组添加无素,添加时是复制操作
        // 
        int append_array( i_json * pv );

        // 
        // 返回数组长度
        // 
        int get_array_size();

    public:
        int init();
        int term();

    public:
        Json::Value m_value;
        STR_ITER m_strs_iter;
        STR_VECT m_strs;

    };

} // xos_json

#endif // __35690CAA_63CD_4a8a_8C4C_DCC696CC57B4__
